package com.mxy.batterychargingreminding;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;

/**
 * 电池广播监听服务
 *
 * @author 马晓勇
 */

public class MyService extends Service {

    private BatteryChangeReceiver batteryChangeReceiver = new BatteryChangeReceiver();
    private static final int NOTICE_ID_PERMANENT = 121445;
    private static final String NOTIFICATION_CHANNEL_ID = "1";
    private static final String NOTIFICATION_CHANNEL_NAME = "lowImportanceChannel";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        //注意如果您的targetSdkVersion>=26
        //Android 8.0开始 当应用程序退到后台或手动退出后，通过startService启动的服务将被停止
        //前台服务的灰色保活方式自测在8.0以上不起作用
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //如果需要让用户知晓，创建常驻通知
//            this.startForeground(NOTICE_ID_PERMANENT, getNotification());
            //如果不希望被用户知晓，使用本方法
            this.startForeground(NOTICE_ID_PERMANENT, new Notification());
        }

        //电池信息
        IntentFilter batteryInfoReceiverIntentFilter = new IntentFilter();
        batteryInfoReceiverIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        batteryInfoReceiverIntentFilter.addAction(Intent.ACTION_BATTERY_LOW);
        batteryInfoReceiverIntentFilter.addAction(Intent.ACTION_POWER_CONNECTED);
        batteryInfoReceiverIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
        this.registerReceiver(batteryChangeReceiver, batteryInfoReceiverIntentFilter);
        return START_STICKY;
    }


    /**
     * 自定义通知栏常编辑
     *
     * @return Notification
     */
    private Notification getNotification() {
        NotificationCompat.Builder builder = Util.getNotificationBuilder(this, NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, false);
//        builder.setTicker(getResources().getString(R.string.lowbattery));
        builder.setSmallIcon(R.drawable.small_icon);
        builder.setContentTitle(getString(R.string.app_name));
        builder.setContentText(getResources().getString(R.string.appisrunning));
        builder.setWhen(System.currentTimeMillis());

        // 第三个参数为设置进度条样式,true : 不确定式进度条，false : 精确自增式进度条
        // 设置带进度条的通知栏 前提是使用默认通知栏布局
        // notificationBuilder.setProgress(100,10,false);

        // 5.0以上横幅消息推送
        // 情况1:设置消息优先级 从Android 5.0开始，如果notification  priority设置为HIGH, MAX,并且设置了notificationbuilder.setDefaults(NotificationCompat.DEFAULT_ALL)
        // 情况2:设置setfullscreenintent();
        // 声音+震动+呼吸灯
        // notificationBuilder.setDefaults(NotificationCompat.DEFAULT_ALL);
        builder.setPriority(NotificationCompat.PRIORITY_MAX);
        //设置点击后不取消
//        notificationBuilder.setAutoCancel(false);
        //设置为前台常驻服务通知 setAutoCancel和setOngoing调用一个即可
        builder.setOngoing(true);

        /**
         设置可见性

         您的应用可以控制在安全锁定屏幕上显示的通知中可见的详细级别。 调用 setVisibility() 并指定以下值之一：

         VISIBILITY_PUBLIC 显示通知的完整内容。
         VISIBILITY_SECRET 不会在锁定屏幕上显示此通知的任何部分。
         VISIBILITY_PRIVATE 显示通知图标和内容标题等基本信息，但是隐藏通知的完整内容。
         设置 VISIBILITY_PRIVATE 后，您还可以提供其中隐藏了某些详细信息的替换版本通知内容。
         例如，短信 应用可能会显示一条通知，指出“您有 3 条新短信”，但是隐藏了短信内容和发件人。
         要提供此替换版本的通知，请先使用 NotificationCompat.Builder 创建替换通知。创建专用通知对象时，请通过 setPublicVersion() 方法为其附加替换通知。
         **/
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.0系统以上，锁屏界面显示
            builder.setVisibility(Notification.VISIBILITY_PUBLIC);
        }
        builder.setContentIntent(notificationClick());
        return builder.build();
    }

    /**
     * @return 通知栏执行点击事件
     */
    private PendingIntent notificationClick() {
        Intent i = new Intent();
        i.setClass(this, MainActivity.class);
        return PendingIntent.getActivity(this.getApplicationContext(), NOTICE_ID_PERMANENT, i, PendingIntent.FLAG_UPDATE_CURRENT);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        this.unregisterReceiver(batteryChangeReceiver);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            this.stopForeground(true);
        }
    }
}